﻿=====================================================================
  SIMYA (EJDERHA TASI) AKTIF EFEKTI
  Arcadia2 Global | Author: Tyolduran
=====================================================================

Ne yapar?
  Simya aktif edilince:
   - Simya penceresindeki carkta her tasin cevresinde, tasin kendi
     renginde yavasca donen bir isik cikar.
   - Her tas merkeze kendi renginde yavas bir isik dalgasi gonderir.
   - Carkin halkasi ve ortadaki kure sakin sekilde parlar (nefes alir).
   - En yuksek sinif taslarin cevresinde ayrica altin bir parilti doner.
   - Envanterdeki simya butonu yavasca yanip soner.
  Simya kapatilinca hepsi kaybolur. Bos slotlarda efekt cikmaz.
  Efektler tiklamayi engellemez, slot ikonlarinin altinda cizilir.

Gereksinim:
  - Sadece client (root + etc). EXE / kaynak (source) degisikligi YOK.
  - Python 2.7 ve Python 3 client ile calisir.
  - Resmi 6 slotlu simya penceresi veya 7 slotlu (ametist) pencere.

Onizleme: onizleme/ klasorundeki GIF dosyalari.

---------------------------------------------------------------------
 0) HANGI DUZEN?
---------------------------------------------------------------------
  uiscript/dragonsoulwindow.py icindeki "EquipmentSlot" slot listesine bak:
   - 6 satir varsa (128,53 / 59,93 / ...)     -> 6 SLOT kullan
   - 7 satir varsa (94,61 / 47,117 / ...)     -> 7 SLOT kullan

---------------------------------------------------------------------
 1) DOKULAR (etc paketi)
---------------------------------------------------------------------
  6 slot icin: client_6_slot/etc/ymir work/ui/dragonsoul/active/
  7 slot icin: client_7_slot/etc/ymir work/ui/dragonsoul/active/

  "active" klasorunu etc paketinin icinde su yola koy:
      ymir work/ui/dragonsoul/active/
  (Oyunda yolu: d:/ymir work/ui/dragonsoul/active/...)

---------------------------------------------------------------------
 2) root/uiscript/dragonsoulwindow.py
---------------------------------------------------------------------
[BUL]
import uiScriptLocale

[ALTINA EKLE - 6 SLOT ICIN]
## Arcadia2 Global | Author: Tyolduran - Simya Aktif Efekti
DS_ACTIVE_FRAMES = 32
DS_ACTIVE_BEAM_BOX = ((133, 59, 21, 103), (65, 99, 89, 63), (65, 142, 89, 63), (133, 142, 21, 103), (133, 142, 87, 63), (133, 99, 87, 63))
DS_ACTIVE_SLOT_POS = ((128, 53), (59, 93), (59, 179), (128, 219), (194, 179), (194, 93))
DS_ACTIVE_RING_POS = (33, 42)

[ALTINA EKLE - 7 SLOT ICIN]
## Arcadia2 Global | Author: Tyolduran - Simya Aktif Efekti
DS_ACTIVE_FRAMES = 32
DS_ACTIVE_BEAM_BOX = ((100, 67, 54, 96), (53, 123, 101, 40), (69, 143, 85, 72), (134, 143, 20, 103), (134, 143, 85, 72), (134, 123, 101, 40), (134, 67, 55, 96))
DS_ACTIVE_SLOT_POS = ((94, 61), (47, 117), (63, 189), (128, 220), (193, 189), (209, 117), (163, 61))
DS_ACTIVE_RING_POS = (34, 43)

[HER IKI DUZEN ICIN, YUKARIDAKININ HEMEN ALTINA EKLE]
def __DSActiveFx(name, prefix, x, y, w, h):
	return {
		"name" : name, "type" : "ani_image", "style" : ("not_pick",),
		"x" : x, "y" : y, "width" : w, "height" : h, "delay" : 7,
		"images" : tuple("d:/ymir work/ui/dragonsoul/active/%s_%02d.tga" % (prefix, i) for i in range(DS_ACTIVE_FRAMES)),
	}

DS_ACTIVE_FX = (__DSActiveFx("DSActiveRing", "ring", DS_ACTIVE_RING_POS[0], DS_ACTIVE_RING_POS[1], 220, 220),) \
	+ tuple(__DSActiveFx("DSActiveAura%d" % i, "aura%d" % i, DS_ACTIVE_SLOT_POS[i][0] - 12, DS_ACTIVE_SLOT_POS[i][1] - 12, 56, 56) for i in range(len(DS_ACTIVE_SLOT_POS))) \
	+ tuple(__DSActiveFx("DSActiveBeam%d" % i, "beam%d" % i, *DS_ACTIVE_BEAM_BOX[i]) for i in range(len(DS_ACTIVE_SLOT_POS))) \
	+ tuple(__DSActiveFx("DSActiveMyth%d" % i, "myth", DS_ACTIVE_SLOT_POS[i][0] - 8, DS_ACTIVE_SLOT_POS[i][1] - 8, 48, 48) for i in range(len(DS_ACTIVE_SLOT_POS)))

[BUL]
					{
						"name" : "EquipmentSlot",

[DEGISTIR]
					) + DS_ACTIVE_FX + (
					{
						"name" : "EquipmentSlot",

  NOT: EquipmentSlot'tan onceki eleman "}," ile bitmeli (normalde boyle).
  Dosyada iki pencere duzeni varsa (if/else), kullandigin duzendeki
  EquipmentSlot'a uygula. Bu sayede efekt slot ikonlarinin ALTINDA cizilir.

---------------------------------------------------------------------
 3) root/uidragonsoul.py
---------------------------------------------------------------------
[BUL]
class DragonSoulWindow(ui.ScriptWindow):

[ALTINA EKLE]
	## Arcadia2 Global | Author: Tyolduran - Simya Aktif Efekti
	DS_FX_SLOT_COUNT = 6		# 7 slotlu pencere icin 7
	DS_FX_GLOW_GRADE = 4		# altin parilti alacak sinif: 4 = efsanevi, mitik sinif eklediysen 5

[BUL] (DragonSoulWindow.__init__ icinde)
		self.SetWindowName("DragonSoulWindow")

[USTUNE EKLE]
		self.dsActiveFx = None

[BUL] (DragonSoulWindow.__LoadWindow icinde)
			wndEquip = self.GetChild("EquipmentSlot")

[ALTINA EKLE]
			self.dsActiveFx = {
				"ring" : self.GetChild("DSActiveRing"),
				"aura" : [self.GetChild("DSActiveAura%d" % i) for i in range(self.DS_FX_SLOT_COUNT)],
				"beam" : [self.GetChild("DSActiveBeam%d" % i) for i in range(self.DS_FX_SLOT_COUNT)],
				"myth" : [self.GetChild("DSActiveMyth%d" % i) for i in range(self.DS_FX_SLOT_COUNT)],
			}
			self.dsActiveFx["ring"].Hide()
			for fx in self.dsActiveFx["aura"] + self.dsActiveFx["beam"] + self.dsActiveFx["myth"]:
				fx.Hide()

[BUL]
	def RefreshItemSlot(self):
		self.RefreshBagSlotWindow()
		self.RefreshEquipSlotWindow()

[DEGISTIR]
	def RefreshItemSlot(self):
		self.RefreshBagSlotWindow()
		self.RefreshEquipSlotWindow()
		self.__RefreshActiveEffect()

	## Arcadia2 Global | Author: Tyolduran - Simya Aktif Efekti
	def __RefreshActiveEffect(self):
		if not self.dsActiveFx:
			return

		if self.isActivated:
			self.dsActiveFx["ring"].Show()
		else:
			self.dsActiveFx["ring"].Hide()

		for i in range(self.DS_FX_SLOT_COUNT):
			itemVnum = 0
			if self.isActivated:
				slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
				itemVnum = player.GetItemIndex(slotNumber)

			for key in ("aura", "beam"):
				if itemVnum:
					self.dsActiveFx[key][i].Show()
				else:
					self.dsActiveFx[key][i].Hide()

			# vnum = tip*10000 + sinif*1000 + basamak*100 + guc*10
			if itemVnum and (itemVnum // 1000) % 10 >= self.DS_FX_GLOW_GRADE:
				self.dsActiveFx["myth"][i].Show()
			else:
				self.dsActiveFx["myth"][i].Hide()

[BUL]
	def ActivateDragonSoulByExtern(self, deck):

  Bu fonksiyonun EN ALTINA (self.RefreshEquipSlotWindow() satirindan sonra) ekle:
		self.__RefreshActiveEffect()

[BUL]
	def DeactivateDragonSoul(self):

  Bu fonksiyonun EN ALTINA (self.activateButton.SetUp() satirindan sonra) ekle:
		self.__RefreshActiveEffect()

---------------------------------------------------------------------
 4) root/uiinventory.py  (envanterdeki simya butonu yanip soner)
---------------------------------------------------------------------
[BUL] (class InventoryWindow -> def __init__ icinde)
		self.__LoadWindow()

[USTUNE EKLE]
		self.dssActiveFx = None

[BUL]
			self.DSSButton.SetEvent(ui.__mem_func__(self.ClickDSSButton))

[ALTINA EKLE]
			self.__CreateDSSActiveEffect()

[BUL] (Destroy icinde)
		self.DSSButton = None

[USTUNE EKLE]
		self.dssActiveFx = None

[BUL]
	def ClickDSSButton(self):

  Bu fonksiyonun ALTINA (ayni hizada) ekle:

	## Arcadia2 Global | Author: Tyolduran - Simya Aktif Efekti
	def __CreateDSSActiveEffect(self):
		if self.dssActiveFx or not self.DSSButton:
			return

		fx = ui.AniImageBox()
		fx.SetParent(self.DSSButton)
		fx.AddFlag("not_pick")
		fx.SetPosition(-8, -8)
		fx.SetSize(54, 50)
		fx.SetDelay(7)
		for i in range(32):
			fx.AppendImage("d:/ymir work/ui/dragonsoul/active/dss_%02d.tga" % i)
		fx.Hide()
		self.dssActiveFx = fx

	def SetDragonSoulActiveEffect(self, isActive):
		if not self.dssActiveFx:
			return

		if isActive:
			self.dssActiveFx.Show()
		else:
			self.dssActiveFx.Hide()

---------------------------------------------------------------------
 5) root/interfacemodule.py
---------------------------------------------------------------------
[BUL]
	def DragonSoulActivate(self, deck):
		if app.ENABLE_DRAGON_SOUL_SYSTEM:
			self.wndDragonSoul.ActivateDragonSoulByExtern(deck)

[DEGISTIR]
	def DragonSoulActivate(self, deck):
		if app.ENABLE_DRAGON_SOUL_SYSTEM:
			self.wndDragonSoul.ActivateDragonSoulByExtern(deck)
			if self.wndInventory:
				self.wndInventory.SetDragonSoulActiveEffect(True)

[BUL]
	def DragonSoulDeactivate(self):
		if app.ENABLE_DRAGON_SOUL_SYSTEM:
			self.wndDragonSoul.DeactivateDragonSoul()

[DEGISTIR]
	def DragonSoulDeactivate(self):
		if app.ENABLE_DRAGON_SOUL_SYSTEM:
			self.wndDragonSoul.DeactivateDragonSoul()
			if self.wndInventory:
				self.wndInventory.SetDragonSoulActiveEffect(False)

---------------------------------------------------------------------
 6) PAKETLE
---------------------------------------------------------------------
  - root : uiscript/dragonsoulwindow.py, uidragonsoul.py, uiinventory.py, interfacemodule.py
  - etc  : ymir work/ui/dragonsoul/active/ (1. adim)

---------------------------------------------------------------------
 AYARLAR
---------------------------------------------------------------------
  Hiz       : uiscript/dragonsoulwindow.py -> "delay" : 7  (buyurse yavaslar)
              envanter butonu: uiinventory.py -> fx.SetDelay(7)
  Altin parilti : uidragonsoul.py -> DS_FX_GLOW_GRADE

---------------------------------------------------------------------
 SORUN GIDERME
---------------------------------------------------------------------
  - Pencere acilmiyor / syserr "DSActiveRing" : 2. adimdaki
    ") + DS_ACTIVE_FX + (" satiri eklenmemis veya yanlis yerde.
  - Efekt kaymis : yanlis duzen (6/7) dokulari veya koordinatlari.
  - Siyah kutu   : dokular etc paketine girmemis / yol yanlis.

Arcadia2 Global | Author: Tyolduran
